﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Permissions;


namespace WindowsFormsApplication1
{

    public partial class Form1 : Form
    {
        int valuation_factor = 3;
        int u = 0;
        int k = 0;
        int nac, kon;
        int rez = 0;
        int pro=0;
        int sek = 0, time = 0, msek = 0,m = 0,kl = 0,size = 0;
        int stroka, player_win, z;
        int[][] Pole;
        float[][] calc_Pole;
        string status = "menu"; 
        string str = "";
        bool end_game = false;
        bool player_first_step = true;
        
        public struct STR
        {
           public string Name;
           public int Score;
        }
        STR[] Players = new STR[16];
        

        public Form1()
        {
            InitializeComponent();
        }

        private void лёгкийУровеньToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pictureBox2.Dispose();
            new_game();
            timer_null();
           //pictureBox2.Image = null;
            pictureBox1.Invalidate();
            status = "easy";
            nac = 0;
            kon = 5;
            kl = 2;
            size = 3;
            m = 3;
            Pole = new int[size][];
            calc_Pole = new float[size][];
            Inicialize();
            new_game();
        }

        private void среднийУровеньToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pictureBox2.Dispose();
            new_game();
            timer_null();
            //pictureBox2.Image = null;
            pictureBox1.Invalidate();
            status = "middle";
            nac = 5;
            kon = 10;
            kl = 4;
            size = 7;
            m = 5;
            Pole = new int[size][];
            calc_Pole = new float[size][];
            Inicialize();
            new_game();
        }

        private void сложныйУровеньToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pictureBox2.Dispose();
            new_game();
            timer_null();
            pictureBox1.Invalidate();
           // pictureBox2.Image = null;
            status = "height";
            nac = 10;
            kon = 15;
            kl = 4;
            size = 15;
            m = 5;
            Pole = new int[size][];
            calc_Pole = new float[size][];
            Inicialize();
            new_game();
        }
        private void помощьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Inicialize();
            //pictureBox1.Invalidate();
            MessageBox.Show("Игрок и компьютер  по очереди ставят на\n свободные клетки поля 3х3(7х7,15х15)знаки \n(один всегда крестики, другой всегда нолики). \nПервый, выстроивший в ряд 3 (5) своих фигуры\n по вертикали, горизонтали или диагонали,\n выигрывает. Право первого хода определяется\nслучайным образом перед началом каждой игры.\n Пользователь всегда ходит ноликами,\n а компьютер - крестиками.\n\n\n                                  УДАЧИ!!!", "Помощь");
        }
        private void таблицаРекордовToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pictureBox2.Dispose();
            timer_null();
            pictureBox1.Invalidate();
           
            status = "rec";
        }
        private void pictureBox1_Click(object sender, EventArgs e)
        {
        }
        
        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            // КОГДА НАХОДИМСЯ В МЕНЮ
            if (status == "menu")
            {
                if (e.X > 135 && e.X < 290 && e.Y > 100 && e.Y < 150)
                {
                    pictureBox1.Invalidate();
                    status = "levels";
                }
                if (e.X > 135 && e.X < 290 && e.Y > 165 && e.Y < 215)
                {
                    pictureBox1.Invalidate();
                    status = "rec";
                }
                if (e.X > 135 && e.X < 290 && e.Y > 230 && e.Y < 280)
                {
                    pictureBox1.Invalidate();
                    status = "help";
                }
                if (e.X > 135 && e.X < 290 && e.Y > 295 && e.Y < 345)
                {
                    pictureBox1.Invalidate();
                    status = "exit";
                }
            }
            // КОГДА НАХОДИМСЯ В УРОВНЯХ
           
            if ((status == "easy") || (status == "middle") || (status == "height"))
            {
                // НАЖАТИЕ НАЧАТЬ ЗАНОВО В УРОВНЯХ
                if (e.X > 35 && e.X < 190 && e.Y > 500 && e.Y < 550)
                {
                    pictureBox1.Invalidate();
                    timer_null();
                    Inicialize();
                    new_game();
                }
            }
            // ПОЛЕ НА ЛЁГКОМ УРОВНЕ ПРОВЕРКА, КОНЕЦ ИГРЫ ИЛИ НЕТ.
            if (status == "easy")
            {
                if (end_game == false) // если игра не закончилась
                {
                    pictureBox1.Invalidate();
                    if (e.X > 130 && e.X < 310 && e.Y > 100 && e.Y < 280)
                    {
                        if (Pole[(e.Y - 100) / 60][(e.X - 130) / 60] == 0)
                            Pole[(e.Y - 100) / 60][(e.X - 130) / 60] = 1; 
                        else return;
                        konec1();
                        nichya();
                        if (player_win == 0) //если не конец(проверяем функцией)
                            ii();// исскуст интеллект, ХОД КОМПА
                        konec1();
                        nichya();
                        proverka();
                    }
                }
            }
                if (status == "middle")
                {
                    if (end_game == false) // если игра не закончилась= false 
                    {
                        pictureBox1.Invalidate();
                        if (e.X > 50 && e.X < 400 && e.Y > 50 && e.Y < 400)
                        {
                            if (Pole[(e.Y - 50) / 50][(e.X - 50) / 50] == 0)
                                Pole[(e.Y - 50) / 50][(e.X - 50) / 50] = 1;
                            else return;

                            konec2();
                            nichya();
                            if (player_win == 0)//если не конец(проверяем функцией)
                                ii();// искусственный интеллект, ХОД КОМПА
                            konec2();
                            nichya();
                            proverka();
                        }
                    }
                }

                if (status == "height")
                {
                    if (end_game == false) // если игра не закончилась= false 
                    {
                        pictureBox1.Invalidate();
                        if (e.X > 0 && e.X < 450 && e.Y > 20 && e.Y < 470)
                        {
                            if (Pole[(e.Y - 20) / 30][e.X / 30] == 0)
                                Pole[(e.Y - 20) / 30][e.X / 30] = 1;
                            else return;
                            konec2();
                            nichya();
                            if (player_win == 0) //если не конец(проверяем функцией)
                                ii();// исскуст интеллект, ХОД КОМПА
                            konec2();
                            nichya();
                            proverka();
                           
                        }
                    }
                }
            }
        //Ввод имени пользователя
       private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (('а' <= e.KeyChar && e.KeyChar <= 'я') || ('А' <= e.KeyChar && e.KeyChar <= 'Я') || (e.KeyChar == 'ё' || e.KeyChar == 'Ё'))
                {
                    str += e.KeyChar;
                    pictureBox1.Invalidate();
                    stroka = 1;
                }
          // Read_FromFile();
         }
       // нажатие Enter, Esc
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Escape:
                    {
                            pictureBox1.Invalidate();
                            status = "menu";    
                            new_game();
                            timer_null();
                        break;
                    }
                case Keys.Enter:
                    {
                       if (stroka==1)
                       {
                           pictureBox1.Invalidate();
                           Players[u].Name = str;
                           //Read_FromFile();
                           //str = "";

                           timer_null();
                           status = "rec";
                           stroka = 0;
                        }
                        break;
                    }
            }
        }
        // РИСУЕМ НА ПИКЧЕБОКС ВСЁ
       private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {        
            switch (status)
            {// РИСУЕМ МЕНЮ
               
                case "rec":
                    {
                        e.Graphics.DrawString("Таблица рекордов:", new Font("Bookman Old Style", 15), new SolidBrush(Color.FromArgb(200, Color.DarkOrange)), 130, 30);
                        e.Graphics.DrawString("Имя:"+"         "+"Результат:", new Font("Consolas", 11), new SolidBrush(Color.FromArgb(200, Color.DarkOrange)), 200, 70);
                        read();
                        for (int i = 0; i < 15; i++)
                        {
                            e.Graphics.DrawString( Players[i].Name , new Font("Consolas", 11), new SolidBrush(Color.FromArgb(200, Color.Black)), 200, 100+20*i);
                            e.Graphics.DrawString(Players[i].Score.ToString(), new Font("Consolas", 11), new SolidBrush(Color.FromArgb(200, Color.Black)), 350, 100 + 20 * i);
                        }
                        string [] item ={"Лёгкий:", "Средний:", "Сложный:"};
                        for (int i = 0; i < 3; i++)
                        {
                            e.Graphics.DrawString(item[i], new Font("Consolas", 13), new SolidBrush(Color.FromArgb(200, Color.DarkOrange)), 30, 100 + 100 * i);
                        }
                        break;
                    }//РИСУЕМ ПРАВИЛА
                case "help":
                    {
                        StringFormat textform = new StringFormat();
                        textform.Alignment = StringAlignment.Center;
                        e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.AntiqueWhite)), 20, 100, 410, 200);
                        e.Graphics.DrawRectangle(new Pen(Color.Black, 2), 20, 100, 410, 200);
                        //e.Graphics.DrawString("Нажмите ESC для возврата в меню", new Font("Consolas", 11), new SolidBrush(Color.FromArgb(200, Color.Black)), 2, 630);
                        e.Graphics.DrawString("Игрок и компьютер  по очереди ставят на\n свободные клетки поля 3х3(7х7,15х15)знаки \n(один всегда крестики, другой всегда нолики). \nПервый, выстроивший в ряд 3 (5) своих фигуры\n по вертикали, горизонтали или диагонали,\n выигрывает. Право первого хода определяется\nслучайным образом перед началом каждой игры.\n Пользователь всегда ходит ноликами,\n а компьютер - крестиками.", new Font("Consolas", 12), new SolidBrush(Color.FromArgb(200, Color.Black)), 227, 120, textform);
                        break;
                    } //ВЫХОД
                case "exit":
                    {
                        Application.Exit();
                        break;
                    } // РИСУЕМ ПОЛЕ, ВРЕМЯ, ни, ESC НА 1 УРОВНЕ И ВСЯКУЮ ФИГНЮ
                case "easy":
                    {
                        for (int i = 0; i < size; i++)
                        {
                            for (int j = 0; j < size; j++)
                            {
                                switch (Pole[i][j])
                                {
                                    case 0:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.FloralWhite), 130 + j * 60, 100 + i * 60, 60, 60);
                                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), 130 + j * 60, 100 + i * 60, 60, 60);
                                            break;
                                        }
                                    case 1:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.FloralWhite), 130 + j * 60, 100 + i * 60, 60, 60);
                                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), 130 + j * 60, 100 + i * 60, 60, 60);
                                            e.Graphics.DrawString("O", new Font("Consolas", 30), new SolidBrush(Color.FromArgb(200, Color.Black)), 130 + j * 60 + 9, 100 + i * 60 + 7);
                                            break;
                                        }
                                    case 2:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.FloralWhite), 130 + j * 60, 100 + i * 60, 60, 60);
                                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), 130 + j * 60, 100 + i * 60, 60, 60);
                                            e.Graphics.DrawString("Х", new Font("Consolas", 30), new SolidBrush(Color.FromArgb(200, Color.Black)), 130 + j * 60 + 9, 100 + i * 60 + 7);
                                            break;
                                        }
                                }
                            }

                        }
                      
                        e.Graphics.DrawString("Время:", new Font("Courier New", 15), new SolidBrush(Color.FromArgb(200, Color.Black)), 35, 475);
                       // e.Graphics.DrawString("Нажмите ESC для возврата в меню", new Font("Consolas", 11), new SolidBrush(Color.FromArgb(200, Color.Black)), 2, 630);
                        switch (pro)
                        {
                            case 1:
                                {
                                    pictureBox1.Invalidate();
                                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                                    e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                                    e.Graphics.DrawString("Вы выиграли!", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5); 
                                    break;
                                }
                            case 2:
                                {
                                    pictureBox1.Invalidate();
                                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                                    e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                                    e.Graphics.DrawString("Вы проиграли!", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5);
                                    break;
                                }
                            case 3:
                                {
                                    pictureBox1.Invalidate();
                                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                                    e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                                    e.Graphics.DrawString("Ничья!", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5);
                                    break;
                                }
                        }
                        
                        if (player_win == 3 && rez==1)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.White)), 40, 100, 350, 300);
                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2),40, 100, 350, 300);
                            e.Graphics.DrawString(" Введите своё имя, используя буквы\n  русского алфавита. По окончании\n                 нажмите Enter: ", new Font("Arial", 15), new SolidBrush(Color.FromArgb(200, Color.DarkOrange)), 40, 100);
                            
                            if (stroka == 1)
                              e.Graphics.DrawString(str, new Font("Consolas", 11), new SolidBrush(Color.FromArgb(250, Color.Black)), 40, 200);
                            
                         }
                        if (k == 1)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                            e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                            e.Graphics.DrawString("Первый ходит компьютер", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5);
                        }
                        if (k == 2)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                            e.Graphics.DrawRectangle(new Pen(Color.FromArgb(150, Color.BlueViolet), 2), 190, 470, 250, 30);
                            e.Graphics.DrawString("Первый ходит пользователь", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190, 470 + 5);
                        }
                        break;
                    }// РИСУЕМ ПОЛЕ,ВРЕМЯ, ни, ESC НА 2 УРОВНЕ И ВСЯКУЮ ФИГНЮ
                case "middle":
                    {

                        for (int i = 0; i < size; i++)
                        {
                            for (int j = 0; j < size; j++)
                            {
                                switch (Pole[i][j])
                                {
                                    case 0:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.FloralWhite), 50 + j * 50, 50 + i * 50, 50, 50);
                                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), 50 + j * 50, 50 + i * 50, 50, 50);
                                            break;
                                        }
                                    case 1:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.FloralWhite), 50 + j * 50, 50 + i * 50, 50, 50);
                                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), 50 + j * 50, 50 + i * 50, 50, 50);
                                            e.Graphics.DrawString("O", new Font("Consolas", 25), new SolidBrush(Color.FromArgb(200, Color.Black)), 50 + j * 50 + 7, 50 + i * 50 + 6);
                                            break;
                                        }
                                    case 2:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.FloralWhite), 50 + j * 50, 50 + i * 50, 50, 50);
                                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), 50 + j * 50, 50 + i * 50, 50, 50);
                                            e.Graphics.DrawString("Х", new Font("Consolas", 25), new SolidBrush(Color.FromArgb(200, Color.Black)), 50 + j * 50 + 9, 50 + i * 50 + 7);
                                            break;
                                        }
                                }
                            }
                        }
                      
                        e.Graphics.DrawString("Время:", new Font("Courier New", 15), new SolidBrush(Color.FromArgb(200, Color.Black)), 35, 475);
                        
                        //e.Graphics.DrawString("Нажмите ESC для возврата в меню", new Font("Consolas", 11), new SolidBrush(Color.FromArgb(200, Color.Black)), 2, 630);

                        if (player_win == 1)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.White)), 40, 100, 350, 300);
                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), 40, 100, 350, 300);
                            e.Graphics.DrawString("Введите своё имя, используя буквы\nрусского алфавита. По окончании\nнажмите Enter: ", new Font("Arial", 15), new SolidBrush(Color.FromArgb(200, Color.Blue)), 40, 100);

                            if (stroka == 1)
                            {
                                e.Graphics.DrawString(str, new Font("Consolas", 11), new SolidBrush(Color.FromArgb(250, Color.Black)), 40, 200);
                            }
                        }
                        switch (pro)
                        {
                            case 1:
                                {
                                    pictureBox1.Invalidate();
                                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                                    e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                                    e.Graphics.DrawString("Вы выиграли!", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5);
                                    break;
                                }
                            case 2:
                                {
                                    pictureBox1.Invalidate();
                                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                                    e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                                    e.Graphics.DrawString("Вы проиграли!", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5);
                                    break;
                                }
                            case 3:
                                {
                                    pictureBox1.Invalidate();
                                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                                    e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                                    e.Graphics.DrawString("Ничья!", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5);
                                    break;
                                }
                        }
                        if (k == 1)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                            e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                            e.Graphics.DrawString("Первый ходит компьютер", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5);
                        }
                        if (k == 2)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                            e.Graphics.DrawRectangle(new Pen(Color.FromArgb(150, Color.BlueViolet), 2), 190, 470, 250, 30);
                            e.Graphics.DrawString("Первый ходит пользователь", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190, 470 + 5);
                        }
                        break;
                    }
                // РИСУЕМ ПОЛЕ, ВРЕМЯ, ни, ESC НА 3 УРОВНЕ И ВСЯКУЮ ФИГНЮ
                case "height":
                    {
                        for (int i = 0; i < size; i++)
                        {
                            for (int j = 0; j < size; j++)
                            {
                                switch (Pole[i][j])
                                {
                                    case 0:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.FloralWhite), j * 30, 20 + i * 30, 30, 30);
                                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), j * 30, 20 + i * 30, 30, 30);
                                            break;
                                        }
                                    case 1:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.FloralWhite), j * 30, 20 + i * 30, 30, 30);
                                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), j * 30, 20 + i * 30, 30, 30);
                                            e.Graphics.DrawString("O", new Font("Consolas", 20), new SolidBrush(Color.FromArgb(200, Color.Black)), j * 30, 20 + i * 30 - 2);
                                            break;
                                        }
                                    case 2:
                                        {
                                            e.Graphics.FillRectangle(new SolidBrush(Color.FloralWhite), j * 30, 20 + i * 30, 30, 30);
                                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), j * 30, 20 + i * 30, 30, 30);
                                            e.Graphics.DrawString("Х", new Font("Consolas", 20), new SolidBrush(Color.FromArgb(200, Color.Black)), j * 30, 20 + i * 30 - 2);
                                            break;
                                        }
                                }
                            }
                        }
                     
                        e.Graphics.DrawString("Время:", new Font("Courier New", 15), new SolidBrush(Color.FromArgb(200, Color.Black)), 35, 475);
                        //e.Graphics.DrawString("Нажмите ESC для возврата в меню", new Font("Consolas", 11), new SolidBrush(Color.FromArgb(200, Color.Black)), 2, 630);

                        if (player_win == 1)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(250, Color.White)), 40, 100, 350, 300);
                            e.Graphics.DrawRectangle(new Pen(Color.Black, 2), 40, 100, 350, 300);
                            e.Graphics.DrawString("Введите своё имя, используя буквы\nрусского алфавита. По окончании\nнажмите Enter: ", new Font("Arial", 15), new SolidBrush(Color.FromArgb(200, Color.Blue)), 40, 100);

                            if (stroka == 1)
                                e.Graphics.DrawString(str, new Font("Consolas", 11), new SolidBrush(Color.FromArgb(250, Color.Black)), 40, 200);
                        }
                        switch (pro)
                        {
                            case 1:
                                {
                                    pictureBox1.Invalidate();
                                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                                    e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                                    e.Graphics.DrawString("Вы выиграли!", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5);
                                    break;
                                }
                            case 2:
                                {
                                    pictureBox1.Invalidate();
                                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                                    e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                                    e.Graphics.DrawString("Вы проиграли!", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5);
                                    break;
                                }
                            case 3:
                                {
                                    pictureBox1.Invalidate();
                                    e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 470, 250, 30);
                                    e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 470, 250, 30);
                                    e.Graphics.DrawString("Ничья!", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190 + 7, 470 + 5);
                                    break;
                                }
                        }
                        if (k == 1)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 477, 250, 30);
                            e.Graphics.DrawRectangle(new Pen(Color.FromArgb(250, Color.BlueViolet), 2), 190, 477, 250, 30);
                            e.Graphics.DrawString("Первый ходит компьютер", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190+7, 470 + 5);
                        }
                        if (k == 2)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(40, Color.Blue)), 190, 477, 250, 30);
                            e.Graphics.DrawRectangle(new Pen(Color.FromArgb(150, Color.BlueViolet),2), 190, 477, 250, 30);
                            e.Graphics.DrawString("Первый ходит пользователь", new Font("Consolas", 13), new SolidBrush(Color.FromArgb(250, Color.Black)), 190, 470 + 5);
                        }
                        break;
                    }
            }
        }
       int nichya()
        {
            int k=0;
            for(int i=0;i<size;i++)
            {
                for (int j = 0; j < size; j++)
                {
                    if ((Pole[i][j] == 1) || (Pole[i][j] == 2))
                        k++;
                }
            } if (k == size*size)
                player_win = 3;
            return player_win;   
        }//проверка на ничью
       private void timer1_Tick(object sender, EventArgs e)
        {
            msek++;
            if (msek == 9)
            {
                msek = 0;
                sek++;
            }
            time = sek * 10 + msek;

            label1.Text = Convert.ToString(sek) + "." + Convert.ToString(msek);
        }// ТАЙМЕР , ОТСЧИТЫВАЕТ ВРЕМЯ ИГРЫ 
       bool First_step()
        {
            Random r = new Random();
            z = r.Next(0, 9);

            if (z % 2 == 0)
                player_first_step = true;
            if (z % 2 != 0)
                player_first_step = false;
            return player_first_step;
           
        }// ОПРЕДЕЛЯЕТ КТО СОВЕРШИТ ПЕРВЫЙ ХОД
      private void Inicialize()
        {
                for (int i = 0; i < Pole.Length; i++)
                Pole[i] = new int[size];

            for (int i = 0; i < calc_Pole.Length; i++)
                calc_Pole[i] = new float[size];

            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    Pole[i][j] = 0;
                    calc_Pole[i][j] = 0;
                }
            }
        }// ОБНУЛЯЕМ МАССИВЫ Pole1 i calc_Pole
       void new_game()
        {
            
            pictureBox1.Invalidate();
            First_step();
            timer1.Start();
            int[][] Pole = new int[size][];
            float[][] calc_Pole = new float[size][];
            for (int i = 0; i < Pole.Length; i++)
                Pole[i] = new int[size];

            for (int i = 0; i < calc_Pole.Length; i++)
                calc_Pole[i] = new float[size];

            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    Pole[i][j] = 0;
                    calc_Pole[i][j] = 0;
                }
            }
            end_game = false;
            player_win = 0;

            if (!player_first_step)
            {
                ii();
                k = 1;
            }
            else k = 2;
            pro = 0;
        }// ОБНУЛЕНИЕ ТАЙМЕРА
       void timer_null()
        {
            timer1.Stop();
            timer1.Dispose();
            label1.Text = "";
            sek = 0;
            msek = 0;
            time = 0;
        } 
       uint calculate(int id, int x, int y)
        {
            Pole[x][y] = id;
            
            int series_length = 0;
            uint sum = 0;
            for (int i = 0; i < m; i++)
            {
                if ((x - kl + i) < 0) continue;
                if ((x + i) > (size - 1)) break;
                for (int j = 0; j < m; j++)
                {
                    
                    if ((Pole[x - kl + i + j][y] != id) && (Pole[x - kl + i + j][y] != 0))
                    {
                        series_length = 0;
                        break;
                    }
                    if (Pole[x - kl + i + j][y] != 0)
                        series_length++;  
                }
                if (series_length == 1) series_length = 0;
                if (series_length == m) series_length = 100;
                uint pow_st = (uint)valuation_factor;
                if (series_length == 100)
                {
                    if (id == 2)
                        pow_st = 10000;
                    else pow_st = 1000;
                }
                else
                {
                    for (int u = 0; u < series_length; u++)
                    { pow_st = pow_st * (uint)valuation_factor; }
                }
                sum += pow_st;
                series_length = 0;

            }
            for (int i = 0; i < m; i++)
            {
                if ((y - kl + i) < 0) continue;
                if ((y + i) > (size - 1)) break;
                for (int j = 0; j < m; j++)
                {
                    if ((Pole[x][y - kl + i + j] != id) && (Pole[x][y - kl + i + j] != 0))
                    {//конец ряда 
                        series_length = 0;
                        break;
                    }

                    if (Pole[x][y - kl + i + j] != 0) series_length++;
                }
                if (series_length == 1) series_length = 0;
                if (series_length == m) series_length = 100;
                uint pow_st = (uint)valuation_factor;
                if (series_length == 100)
                {
                    if (id == 2)
                        pow_st = 10000;
                    else pow_st = 1000;
                }
                else
                {
                    for (int u = 0; u < series_length; u++)
                        pow_st = pow_st * (uint)valuation_factor;
                }
                sum += pow_st;
                series_length = 0;
            }
            for (int i = 0; i < m; i++)
            {
                if ((y - kl + i) < 0) continue;
                if ((x - kl + i) < 0) continue;
                if ((x + i) > (size - 1)) break;
                if ((y + i) > (size - 1)) break;
                for (int j = 0; j < m; j++)
                {
                    if ((Pole[x - kl + i + j][y - kl + i + j] != id) && (Pole[x - kl + i + j][y - kl + i + j] != 0))
                    {
                        series_length = 0;
                        break;
                    }
                    if (Pole[x - kl + i + j][y - kl + i + j] != 0) series_length++;
                }
                if (series_length == 1) series_length = 0;
                if (series_length == m) series_length = 100;
                uint pow_st = (uint)valuation_factor;
                if (series_length == 100)
                {
                    if (id == 2)
                        pow_st = 10000;
                    else pow_st = 1000;
                }
                else
                {
                    for (int u = 0; u < series_length; u++)
                        pow_st = pow_st * (uint)valuation_factor;
                }
                sum += pow_st;
                series_length = 0;

            }
            for (int i = 0; i < m; i++)
            {
                if ((y - kl + i) < 0) continue;
                if ((x + kl - i) > (size - 1)) continue;
                if ((x - i) < 0) break;
                if ((y + i) > (size - 1)) break;
                for (int j = 0; j < m; j++)
                {
                    if ((Pole[x + kl - i - j][y - kl + i + j] != id) && (Pole[x + kl - i - j][y - kl + i + j] != 0))
                    {
                        series_length = 0;
                        break;
                    }
                    if (Pole[x + kl - i - j][y - kl + i + j] != 0) series_length++;
                }
                if (series_length == 1) series_length = 0;
                if (series_length == m) series_length = 100;
                uint pow_st = (uint)valuation_factor;
                if (series_length == 100)
                {
                    if (id == 2) 
                        pow_st = 10000;
                    else pow_st = 1000;
                }
                else
                {
                    for (int u = 0; u < series_length; u++)
                        pow_st = pow_st * (uint)valuation_factor;
                }
                sum += pow_st;
                series_length = 0;

            }
            Pole[x][y] = 0;
            return sum;
        }//Функция расчета оценочной функции
       void ii()
        {
            float max = -1;
            int cur_x = 0, cur_y = 0;
            int povtor_num = 0;
            int cur_povtor = 0;
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    if ((Pole[i][j] == 0) && (Pole[i][j] != 1))
                    {//расчёт оценочной функции
                        calc_Pole[i][j] = (calculate(2, i, j)+ calculate(1, i, j));// +calculate(1, i, j);

                        if (calc_Pole[i][j] == max)
                            povtor_num++;

                        if (calc_Pole[i][j] > max)
                        {
                            max = calc_Pole[i][j];
                            povtor_num = 0;
                            cur_x = i;
                            cur_y = j;
                        }
                    }
                }
            }
            if (max == -1) return;

            if (povtor_num > 0)
            {
                Random rand = new Random();
                cur_povtor = rand.Next(1, povtor_num);
                int buf_povtor = -1;
                for (int i = 0; i < size; i++)
                {
                    for (int j = 0; j < size; j++)
                    {
                        if (calc_Pole[i][j] == max)
                        {
                            buf_povtor++;
                            if (buf_povtor == cur_povtor)
                            {

                                Pole[i][j] = 2;
                                return;
                            }
                        }

                    }
                }
            }
            else
            {
                Pole[cur_x][cur_y] = 2;
            }
        }// ход компьютера
       void konec1()
        {
            for (int i = 0; i < size; i++)// столбец
            {
                for (int j = 0; j < size - 2; j++)
                {
                    if (Pole[i][j] == 1 && Pole[i][j + 1] == 1 && Pole[i][j + 2] == 1)
                    {
                        player_win = 1;
                    }
                    if (Pole[i][j] == 2 && Pole[i][j + 1] == 2 && Pole[i][j + 2] == 2)
                    {
                        player_win = 2;
                    }
                }
            }
            for (int j = 0; j < size; j++)// строки
            {
                for (int i = 0; i < size - 2; i++)
                {
                    if (Pole[i][j] == 1 && Pole[i + 1][j] == 1 && Pole[i + 2][j] == 1)
                    {
                        player_win = 1;
                    }
                    if (Pole[i][j] == 2 && Pole[i + 1][j] == 2 && Pole[i + 2][j] == 2)
                    {
                        player_win = 2;
                    }
                }
            }
            for (int i = 0; i < size - 2; i++)// вправо вниз
            {
                for (int j = 0; j < size - 2; j++)
                {
                    if (Pole[i][j] == 1 && Pole[i + 1][j + 1] == 1 && Pole[i + 2][j + 2] == 1)
                    {
                        player_win = 1;
                    }
                    if (Pole[i][j] == 2 && Pole[i + 1][j + 1] == 2 && Pole[i + 2][j + 2] == 2)
                    {
                        player_win = 2;
                    }
                }
            }
            for (int i = 0; i < size - 2; i++)
            {
                for (int j = size - 1; j > 1; j--)
                {
                    if (Pole[i][j] == 1 && Pole[i+1][j - 1] == 1 && Pole[i+2][j - 2] == 1)
                    {
                        player_win = 1;
                    }
                    if (Pole[i][j] == 2 && Pole[i + 1][j - 1] == 2 && Pole[i + 2][j - 2] == 2)
                    {
                        player_win = 2;
                    }
                }

            }
            
        }// функция проверки конца игры 3х3
       void konec2()
        {
            for (int i = 0; i < size; i++)// столбец
            {
                for (int j = 0; j < size - 4; j++)
                {
                    if (Pole[i][j] == 1 && Pole[i][j + 1] == 1 && Pole[i][j + 2] == 1 && Pole[i][j + 3] == 1 && Pole[i][j + 4] == 1)
                    {
                        player_win = 1;
                    }
                    if (Pole[i][j] == 2 && Pole[i][j + 1] == 2 && Pole[i][j + 2] == 2 && Pole[i][j + 3] == 2 && Pole[i][j + 4] == 2)
                    {
                        player_win = 2;
                    }
                }
            }
            for (int j = 0; j < size; j++)// строки
            {
                for (int i = 0; i < size - 4; i++)
                {
                    if (Pole[i][j] == 1 && Pole[i + 1][j] == 1 && Pole[i + 2][j] == 1 && Pole[i + 3][j] == 1 && Pole[i + 4][j] == 1)
                    {
                        player_win = 1;
                    }
                    if (Pole[i][j] == 2 && Pole[i + 1][j] == 2 && Pole[i + 2][j] == 2 && Pole[i + 3][j] == 2 && Pole[i + 4][j] == 2)
                    {
                        player_win = 2;
                    }
                }
            }
            for (int i = 0; i < size - 4; i++)// вправо вниз
            {
                for (int j = 0; j < size - 4; j++)
                {
                    if (Pole[i][j] == 1 && Pole[i + 1][j + 1] == 1 && Pole[i + 2][j + 2] == 1 && Pole[i + 3][j + 3] == 1 && Pole[i + 4][j + 4] == 1)
                    {
                        player_win = 1;
                    }
                    if (Pole[i][j] == 2 && Pole[i + 1][j + 1] == 2 && Pole[i + 2][j + 2] == 2 && Pole[i + 3][j + 3] == 2 && Pole[i + 4][j + 4] == 2)
                    {
                        player_win = 2;
                    }
                }
            }
            for (int i = 0; i < size - 4; i++)
            {
                for (int j = size - 1; j > 3; j--) //влево вниз
                {
                    if (Pole[i][j] == 1 && Pole[i + 1][j - 1] == 1 && Pole[i + 2][j - 2] == 1 && Pole[i + 3][j - 3] == 1 && Pole[i + 4][j - 4] == 1)
                    {
                        player_win = 1;
                    }
                    if (Pole[i][j] == 2 && Pole[i + 1][j - 1] == 2 && Pole[i + 2][j - 2] == 2 && Pole[i + 3][j - 3] == 2 && Pole[i + 4][j - 4] == 2)
                    {
                        player_win = 2;
                    }
                }
            }
        }// функция проверки конца игры 7х7 и 15х15
       void Read_FromFile()
       {
           FileInfo FileRecords = new FileInfo("rec.txt");
           if (FileRecords.Exists) //Если файл существует
           {
             FileStream fs = new FileStream("rec.txt", FileMode.Open);
               StreamReader sr = new StreamReader(fs);
                            
               string temp_str = sr.ReadToEnd();
               string[] str = temp_str.Split(' ');

               for (int i = 0; i < 15; i++)
               {
                   Players[i].Name = str[2*i];
                   Players[i].Score = Convert.ToInt32(str[2*i + 1]);
               }
               if ((Players[kon - 1].Score > Players[15].Score) || (Players[kon - 1].Score == 0))
                   rez = 1;

               for (int i = nac; i < kon; i++)
               {
                   if ((Players[i].Score > Players[15].Score) || (Players[i].Score == 0))
                   {
                     for (int j = kon - 1; j > i; j--)
                       {
                           Players[j].Name = Players[j - 1].Name;
                           Players[j].Score = Players[j - 1].Score;
                       }
                     
                      u = i;
                       Players[u].Name = Players[15].Name;
                       Players[i].Score = Players[15].Score;
                       break;
                   }
               }
               sr.Close();
               fs.Close();

              StreamWriter sw = new StreamWriter("rec.txt", false);
               sw.WriteLine(Players[0].Name + " " + Players[0].Score.ToString());
               for (int i = 1; i < 15; i++)
               {
                   sw.WriteLine( " " + Players[i].Name + " " + Players[i].Score.ToString());
               }
               sw.Close();
           }

       }//сравниваем результаты в файле
       void read()
       {
           FileStream fs = new FileStream("rec.txt", FileMode.Open);
           StreamReader sr = new StreamReader(fs);
           string temp_str = sr.ReadToEnd();
           string[] str = temp_str.Split(' ');

           for (int i = 0; i < 15; i++)
           {
               Players[i].Name = str[2 * i];
               Players[i].Score = Convert.ToInt32(str[2 * i + 1]);
           }
           sr.Close();
           fs.Close();
       }// считываем в таблицу рекордов
       void proverka()
       {
           if (player_win == 1)
           {
               timer1.Stop();
               k = 0;
               pro = 1;
               Players[15].Score = time;
               end_game = true;
               return;
           }
           if (player_win == 2)// если конец
           {
               timer1.Stop();
               pro = 2;
               k = 0;
               end_game = true;
               return;
           }
          
           if (player_win == 3)
           {
               pro = 3;
               k = 0;
               timer1.Stop();
               Players[15].Score = time;
               Read_FromFile();
               end_game = true;

               return;
           } 
       }

       private void pictureBox2_Click(object sender, EventArgs e)
       {

       }

       private void label2_Click(object sender, EventArgs e)
       {

       }

       private void Form1_Load(object sender, EventArgs e)
       {

       }

       private void pictureBox2_Click_1(object sender, EventArgs e)
       {

       }

      

       // проверка на выигрыш/ничью
    }
}

